/************************************
* 4．编写程序实现n阶（n为奇数）魔方。
* n为外部输入参数，输出结果按方阵排列。
*************************************/


#include<stdio.h>
#include<malloc.h>

typedef struct{int col,row;int* data;} mat;

void print_mat(const mat* m){
    int i,j;
    printf("<Matrix %dx%d>\n",m->row,m->col);
    for(i=0;i<m->col;i++){
        for(j=0;j<m->row;j++)printf("%4d ",(m->data)[i*m->col+j]);
        putchar('\n');
    }
}

mat* gen_odd_magic(int k){
    if(k%2==0)return NULL;
    mat* m = malloc(sizeof(mat));
    m->row = m->col = k;
    m->data = malloc(sizeof(int)*k*k);
    int i,j,x,y;
    i = 1; j = k/2 + 1;
    for(x=0;x<k;x++){
        for(y=0;y<k;y++){
            i = (i-1+k)%k;
            j = (j-1+k)%k;
            m->data[i*m->row+j] = x * k + y + 1;
        }
        j = (j+1)%k; i = (i+2)%k;
    }
    return m;
}

int main(){
    int k = 0;
    printf("k= ");
    scanf("%d",&k);
    if(k%2==0){printf("Must be odd number.\n");return 0;}
    mat* m = gen_odd_magic(k);
    print_mat(m);
    free(m->data);
    free(m);
    return 0;
}